package main

import (
	"fmt"
	"reflect"
)

// Shape 定义一个形状接口
type Shape interface {
	// Area 定义 求面积 的接口方法
	Area() float64
}

// Rectangle 定义一个矩形结构体
type Rectangle struct {
	width  float64
	height float64
}

// Area 矩形结构体 实现Shape接口的Area方法
func (r Rectangle) Area() float64 {
	return r.width * r.height
}

// Circle 定义一个圆形结构体
type Circle struct {
	radius float64
}

// Area 圆形结构体 实现Shape接口的Area方法
func (c Circle) Area() float64 {
	return 3.14 * c.radius * c.radius
}

func main() {
	// 创建一个Shape类型的切片（未指定数组长度就是切片）
	shapes := []Shape{
		Rectangle{width: 6, height: 3},
	}
	shapes = append(shapes, Circle{radius: 2})

	// 遍历切片并调用Area方法
	for _, shape := range shapes {
		fmt.Println("Area of", reflect.TypeOf(shape), ":", shape.Area()) // 18; 12.56
	}

	shape := Rectangle{3, 5}
	fmt.Println("Area of Rectangle:", shape.Area()) // 15
}
